//抽象类，表示豆浆
public abstract class SoyaMilk {

    //模板方法，make，make方法可以是final修饰，不让子类去覆盖。
    final void make(){
        select();
        if(customerWantadd()){
            add();
        }
        soak();
        beat();
    }
    //选材料
    private void select(){
        System.out.println("第一步，选择新鲜的黄豆。");
    }
    //添加不同的配料，抽象方法，子类具体实现
    abstract void add();
    //浸泡
    private void soak(){
        System.out.println("第三步，黄豆和配料进行浸泡。");
    }
    //打磨
    private void beat(){
        System.out.println("第四步，黄豆和配料进行打磨。");
    }
    //钩子函数
    boolean customerWantadd( ){
        return true;
    }
}
